(function() {
    var c = tinymce.each, a = {paste_auto_cleanup_on_paste: true, paste_enable_default_filters: true, paste_block_drop: false, paste_retain_style_properties: "none", paste_strip_class_attributes: "mso", paste_remove_spans: false, paste_remove_styles: false, paste_remove_styles_if_webkit: true, paste_convert_middot_lists: true, paste_convert_headers_to_strong: false, paste_dialog_width: "450", paste_dialog_height: "400", paste_text_use_dialog: false, paste_text_sticky: false, paste_text_sticky_default: false, paste_text_notifyalways: false, paste_text_linebreaktype: "combined", paste_text_replacements: [[/\u2026/g, "..."], [/[\x93\x94\u201c\u201d]/g, '"'], [/[\x60\x91\x92\u2018\u2019]/g, "'"]]};
    function b(d, e) {
        return d.getParam(e, a[e])
    }
    tinymce.create("tinymce.plugins.PastePlugin", {init: function(d, e) {
            var f = this;
            f.editor = d;
            f.url = e;
            f.onPreProcess = new tinymce.util.Dispatcher(f);
            f.onPostProcess = new tinymce.util.Dispatcher(f);
            f.onPreProcess.add(f._preProcess);
            f.onPostProcess.add(f._postProcess);
            f.onPreProcess.add(function(i, j) {
                d.execCallback("paste_preprocess", i, j)
            });
            f.onPostProcess.add(function(i, j) {
                d.execCallback("paste_postprocess", i, j)
            });
            d.onKeyDown.addToTop(function(i, j) {
                if (((tinymce.isMac ? j.metaKey : j.ctrlKey) && j.keyCode == 86) || (j.shiftKey && j.keyCode == 45)) {
                    return false
                }
            });
            d.pasteAsPlainText = b(d, "paste_text_sticky_default");
            function h(l, j) {
                var k = d.dom, i;
                f.onPreProcess.dispatch(f, l);
                l.node = k.create("div", 0, l.content);
                if (tinymce.isGecko) {
                    i = d.selection.getRng(true);
                    if (i.startContainer == i.endContainer && i.startContainer.nodeType == 3) {
                        if (l.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName) && l.content.indexOf("__MCE_ITEM__") === -1) {
                            k.remove(l.node.firstChild, true)
                        }
                    }
                }
                f.onPostProcess.dispatch(f, l);
                l.content = d.serializer.serialize(l.node, {getInner: 1, forced_root_block: ""});
                if ((!j) && (d.pasteAsPlainText)) {
                    f._insertPlainText(l.content);
                    if (!b(d, "paste_text_sticky")) {
                        d.pasteAsPlainText = false;
                        d.controlManager.setActive("pastetext", false)
                    }
                } else {
                    f._insert(l.content)
                }
            }
            d.addCommand("mceInsertClipboardContent", function(i, j) {
                h(j, true)
            });
            if (!b(d, "paste_text_use_dialog")) {
                d.addCommand("mcePasteText", function(j, i) {
                    var k = tinymce.util.Cookie;
                    d.pasteAsPlainText = !d.pasteAsPlainText;
                    d.controlManager.setActive("pastetext", d.pasteAsPlainText);
                    if ((d.pasteAsPlainText) && (!k.get("tinymcePasteText"))) {
                        if (b(d, "paste_text_sticky")) {
                            d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))
                        } else {
                            d.windowManager.alert(d.translate("paste.plaintext_mode"))
                        }
                        if (!b(d, "paste_text_notifyalways")) {
                            k.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31))
                        }
                    }
                })
            }
            d.addButton("pastetext", {title: "paste.paste_text_desc", cmd: "mcePasteText"});
            d.addButton("selectall", {title: "paste.selectall_desc", cmd: "selectall"});
            function g(s) {
                var l, p, j, t, k = d.selection, o = d.dom, q = d.getBody(), i, r;
                if (s.clipboardData || o.doc.dataTransfer) {
                    r = (s.clipboardData || o.doc.dataTransfer).getData("Text");
                    if (d.pasteAsPlainText) {
                        s.preventDefault();
                        h({content: o.encode(r).replace(/\r?\n/g, "<br />")});
                        return
                    }
                }
                if (o.get("_mcePaste")) {
                    return
                }
                l = o.add(q, "div", {id: "_mcePaste", "class": "mcePaste", "data-mce-bogus": "1"}, "\uFEFF\uFEFF");
                if (q != d.getDoc().body) {
                    i = o.getPos(d.selection.getStart(), q).y
                } else {
                    i = q.scrollTop + o.getViewPort(d.getWin()).y
                }
                o.setStyles(l, {position: "absolute", left: tinymce.isGecko ? -40 : 0, top: i - 25, width: 1, height: 1, overflow: "hidden"});
                if (tinymce.isIE) {
                    t = k.getRng();
                    j = o.doc.body.createTextRange();
                    j.moveToElementText(l);
                    j.execCommand("Paste");
                    o.remove(l);
                    if (l.innerHTML === "\uFEFF\uFEFF") {
                        d.execCommand("mcePasteWord");
                        s.preventDefault();
                        return
                    }
                    k.setRng(t);
                    k.setContent("");
                    setTimeout(function() {
                        h({content: l.innerHTML})
                    }, 0);
                    return tinymce.dom.Event.cancel(s)
                } else {
                    function m(n) {
                        n.preventDefault()
                    }
                    o.bind(d.getDoc(), "mousedown", m);
                    o.bind(d.getDoc(), "keydown", m);
                    p = d.selection.getRng();
                    l = l.firstChild;
                    j = d.getDoc().createRange();
                    j.setStart(l, 0);
                    j.setEnd(l, 2);
                    k.setRng(j);
                    window.setTimeout(function() {
                        var u = "", n;
                        if (!o.select("div.mcePaste > div.mcePaste").length) {
                            n = o.select("div.mcePaste");
                            c(n, function(w) {
                                var v = w.firstChild;
                                if (v && v.nodeName == "DIV" && v.style.marginTop && v.style.backgroundColor) {
                                    o.remove(v, 1)
                                }
                                c(o.select("span.Apple-style-span", w), function(x) {
                                    o.remove(x, 1)
                                });
                                c(o.select("br[data-mce-bogus]", w), function(x) {
                                    o.remove(x)
                                });
                                if (w.parentNode.className != "mcePaste") {
                                    u += w.innerHTML
                                }
                            })
                        } else {
                            u = "<p>" + o.encode(r).replace(/\r?\n\r?\n/g, "</p><p>").replace(/\r?\n/g, "<br />") + "</p>"
                        }
                        c(o.select("div.mcePaste"), function(v) {
                            o.remove(v)
                        });
                        if (p) {
                            k.setRng(p)
                        }
                        h({content: u});
                        o.unbind(d.getDoc(), "mousedown", m);
                        o.unbind(d.getDoc(), "keydown", m)
                    }, 0)
                }
            }
            if (b(d, "paste_auto_cleanup_on_paste")) {
                if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
                    d.onKeyDown.addToTop(function(i, j) {
                        if (((tinymce.isMac ? j.metaKey : j.ctrlKey) && j.keyCode == 86) || (j.shiftKey && j.keyCode == 45)) {
                            g(j)
                        }
                    })
                } else {
                    d.onPaste.addToTop(function(i, j) {
                        return g(j)
                    })
                }
            }
            d.onInit.add(function() {
                d.controlManager.setActive("pastetext", d.pasteAsPlainText);
                if (b(d, "paste_block_drop")) {
                    d.dom.bind(d.getBody(), ["dragend", "dragover", "draggesture", "dragdrop", "drop", "drag"], function(i) {
                        i.preventDefault();
                        i.stopPropagation();
                        return false
                    })
                }
            });
            f._legacySupport()
        }, getInfo: function() {
            return{longname: "Paste text/word", author: "Moxiecode Systems AB", authorurl: "http://tinymce.moxiecode.com", infourl: "http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste", version: tinymce.majorVersion + "." + tinymce.minorVersion}
        }, _preProcess: function(g, e) {
            var k = this.editor, j = e.content, p = tinymce.grep, n = tinymce.explode, f = tinymce.trim, l, i;
            function d(h) {
                c(h, function(o) {
                    if (o.constructor == RegExp) {
                        j = j.replace(o, "")
                    } else {
                        j = j.replace(o[0], o[1])
                    }
                })
            }
            if (k.settings.paste_enable_default_filters == false) {
                return
            }
            if (tinymce.isIE && document.documentMode >= 9) {
                d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g, "$1"]]);
                d([[/<br><br>/g, "<BR><BR>"], [/<br>/g, " "], [/<BR><BR>/g, "<br>"]])
            }
            if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j) || e.wordContent) {
                e.wordContent = true;
                d([/^\s*(&nbsp;)+/gi, /(&nbsp;|<br[^>]*>)+\s*$/gi]);
                if (b(k, "paste_convert_headers_to_strong")) {
                    j = j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>")
                }
                if (b(k, "paste_convert_middot_lists")) {
                    d([[/<!--\[if !supportLists\]-->/gi, "$&__MCE_ITEM__"], [/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, "$1__MCE_ITEM__"], [/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi, "$1__MCE_ITEM__"]])
                }
                d([/<!--[\s\S]+?-->/gi, /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, [/<(\/?)s>/gi, "<$1strike>"], [/&nbsp;/gi, "\u00a0"]]);
                do {
                    l = j.length;
                    j = j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1")
                } while (l != j.length);
                if (b(k, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) {
                    j = j.replace(/<\/?span[^>]*>/gi, "")
                } else {
                    d([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi, function(o, h) {
                                return(h.length > 0) ? h.replace(/./, " ").slice(Math.floor(h.length / 2)).split("").join("\u00a0") : ""
                            }], [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, function(t, h, r) {
                                var u = [], o = 0, q = n(f(r).replace(/&quot;/gi, "'"), ";");
                                c(q, function(s) {
                                    var w, y, z = n(s, ":");
                                    function x(A) {
                                        return A + ((A !== "0") && (/\d$/.test(A))) ? "px" : ""
                                    }
                                    if (z.length == 2) {
                                        w = z[0].toLowerCase();
                                        y = z[1].toLowerCase();
                                        switch (w) {
                                            case"mso-padding-alt":
                                            case"mso-padding-top-alt":
                                            case"mso-padding-right-alt":
                                            case"mso-padding-bottom-alt":
                                            case"mso-padding-left-alt":
                                            case"mso-margin-alt":
                                            case"mso-margin-top-alt":
                                            case"mso-margin-right-alt":
                                            case"mso-margin-bottom-alt":
                                            case"mso-margin-left-alt":
                                            case"mso-table-layout-alt":
                                            case"mso-height":
                                            case"mso-width":
                                            case"mso-vertical-align-alt":
                                                u[o++] = w.replace(/^mso-|-alt$/g, "") + ":" + x(y);
                                                return;
                                            case"horiz-align":
                                                u[o++] = "text-align:" + y;
                                                return;
                                            case"vert-align":
                                                u[o++] = "vertical-align:" + y;
                                                return;
                                            case"font-color":
                                            case"mso-foreground":
                                                u[o++] = "color:" + y;
                                                return;
                                            case"mso-background":
                                            case"mso-highlight":
                                                u[o++] = "background:" + y;
                                                return;
                                            case"mso-default-height":
                                                u[o++] = "min-height:" + x(y);
                                                return;
                                            case"mso-default-width":
                                                u[o++] = "min-width:" + x(y);
                                                return;
                                            case"mso-padding-between-alt":
                                                u[o++] = "border-collapse:separate;border-spacing:" + x(y);
                                                return;
                                            case"text-line-through":
                                                if ((y == "single") || (y == "double")) {
                                                    u[o++] = "text-decoration:line-through"
                                                }
                                                return;
                                            case"mso-zero-height":
                                                if (y == "yes") {
                                                    u[o++] = "display:none"
                                                }
                                                return
                                        }
                                        if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)) {
                                            return
                                        }
                                        u[o++] = w + ":" + z[1]
                                    }
                                });
                                if (o > 0) {
                                    return h + ' style="' + u.join(";") + '"'
                                } else {
                                    return h
                                }
                            }]])
                }
            }
            if (b(k, "paste_convert_headers_to_strong")) {
                d([[/<h[1-6][^>]*>/gi, "<p><strong>"], [/<\/h[1-6][^>]*>/gi, "</strong></p>"]])
            }
            d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, ""]]);
            i = b(k, "paste_strip_class_attributes");
            if (i !== "none") {
                function m(q, o) {
                    if (i === "all") {
                        return""
                    }
                    var h = p(n(o.replace(/^(["'])(.*)\1$/, "$2"), " "), function(r) {
                        return(/^(?!mso)/i.test(r))
                    });
                    return h.length ? ' class="' + h.join(" ") + '"' : ""
                }
                j = j.replace(/ class="([^"]+)"/gi, m);
                j = j.replace(/ class=([\-\w]+)/gi, m)
            }
            if (b(k, "paste_remove_spans")) {
                j = j.replace(/<\/?span[^>]*>/gi, "")
            }
            e.content = j
        }, _postProcess: function(g, i) {
            var f = this, e = f.editor, h = e.dom, d;
            if (e.settings.paste_enable_default_filters == false) {
                return
            }
            if (i.wordContent) {
                c(h.select("a", i.node), function(j) {
                    if (!j.href || j.href.indexOf("#_Toc") != -1) {
                        h.remove(j, 1)
                    }
                });
                if (b(e, "paste_convert_middot_lists")) {
                    f._convertLists(g, i)
                }
                d = b(e, "paste_retain_style_properties");
                if ((tinymce.is(d, "string")) && (d !== "all") && (d !== "*")) {
                    d = tinymce.explode(d.replace(/^none$/i, ""));
                    c(h.select("*", i.node), function(m) {
                        var n = {}, k = 0, l, o, j;
                        if (d) {
                            for (l = 0; l < d.length; l++) {
                                o = d[l];
                                j = h.getStyle(m, o);
                                if (j) {
                                    n[o] = j;
                                    k++
                                }
                            }
                        }
                        h.setAttrib(m, "style", "");
                        if (d && k > 0) {
                            h.setStyles(m, n)
                        } else {
                            if (m.nodeName == "SPAN" && !m.className) {
                                h.remove(m, true)
                            }
                        }
                    })
                }
            }
            if (b(e, "paste_remove_styles") || (b(e, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) {
                c(h.select("*[style]", i.node), function(j) {
                    j.removeAttribute("style");
                    j.removeAttribute("data-mce-style")
                })
            } else {
                if (tinymce.isWebKit) {
                    c(h.select("*", i.node), function(j) {
                        j.removeAttribute("data-mce-style")
                    })
                }
            }
        }, _convertLists: function(g, e) {
            var i = g.editor.dom, h, l, d = -1, f, m = [], k, j;
            c(i.select("p", e.node), function(t) {
                var q, u = "", s, r, n, o;
                for (q = t.firstChild; q && q.nodeType == 3; q = q.nextSibling) {
                    u += q.nodeValue
                }
                u = t.innerHTML.replace(/<\/?\w+[^>]*>/gi, "").replace(/&nbsp;/g, "\u00a0");
                if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)) {
                    s = "ul"
                }
                if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)) {
                    s = "ol"
                }
                if (s) {
                    f = parseFloat(t.style.marginLeft || 0);
                    if (f > d) {
                        m.push(f)
                    }
                    if (!h || s != k) {
                        h = i.create(s);
                        i.insertAfter(h, t)
                    } else {
                        if (f > d) {
                            h = l.appendChild(i.create(s))
                        } else {
                            if (f < d) {
                                n = tinymce.inArray(m, f);
                                o = i.getParents(h.parentNode, s);
                                h = o[o.length - 1 - n] || h
                            }
                        }
                    }
                    c(i.select("span", t), function(v) {
                        var p = v.innerHTML.replace(/<\/?\w+[^>]*>/gi, "");
                        if (s == "ul" && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)) {
                            i.remove(v)
                        } else {
                            if (/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)) {
                                i.remove(v)
                            }
                        }
                    });
                    r = t.innerHTML;
                    if (s == "ul") {
                        r = t.innerHTML.replace(/__MCE_ITEM__/g, "").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/, "")
                    } else {
                        r = t.innerHTML.replace(/__MCE_ITEM__/g, "").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/, "")
                    }
                    l = h.appendChild(i.create("li", 0, r));
                    i.remove(t);
                    d = f;
                    k = s
                } else {
                    h = d = 0
                }
            });
            j = e.node.innerHTML;
            if (j.indexOf("__MCE_ITEM__") != -1) {
                e.node.innerHTML = j.replace(/__MCE_ITEM__/g, "")
            }
        }, _insert: function(f, d) {
            var e = this.editor, g = e.selection.getRng();
            if (!e.selection.isCollapsed() && g.startContainer != g.endContainer) {
                e.getDoc().execCommand("Delete", false, null)
            }
            e.execCommand("mceInsertContent", false, f, {skip_undo: d})
        }, _insertPlainText: function(g) {
            var d = this.editor, e = b(d, "paste_text_linebreaktype"), i = b(d, "paste_text_replacements"), f = tinymce.is;
            function h(j) {
                c(j, function(k) {
                    if (k.constructor == RegExp) {
                        g = g.replace(k, "")
                    } else {
                        g = g.replace(k[0], k[1])
                    }
                })
            }
            if ((typeof(g) === "string") && (g.length > 0)) {
                if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(g)) {
                    h([/[\n\r]+/g])
                } else {
                    h([/\r+/g])
                }
                h([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], [/<br[^>]*>|<\/tr>/gi, "\n"], [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], /<[a-z!\/?][^>]*>/gi, [/&nbsp;/gi, " "], [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], [/\n{3,}/g, "\n\n"]]);
                g = d.dom.decode(tinymce.html.Entities.encodeRaw(g));
                if (f(i, "array")) {
                    h(i)
                } else {
                    if (f(i, "string")) {
                        h(new RegExp(i, "gi"))
                    }
                }
                if (e == "none") {
                    h([[/\n+/g, " "]])
                } else {
                    if (e == "br") {
                        h([[/\n/g, "<br />"]])
                    } else {
                        if (e == "p") {
                            h([[/\n+/g, "</p><p>"], [/^(.*<\/p>)(<p>)$/, "<p>$1"]])
                        } else {
                            h([[/\n\n/g, "</p><p>"], [/^(.*<\/p>)(<p>)$/, "<p>$1"], [/\n/g, "<br />"]])
                        }
                    }
                }
                d.execCommand("mceInsertContent", false, g)
            }
        }, _legacySupport: function() {
            var e = this, d = e.editor;
            d.addCommand("mcePasteWord", function() {
                d.windowManager.open({file: e.url + "/pasteword.htm", width: parseInt(b(d, "paste_dialog_width")), height: parseInt(b(d, "paste_dialog_height")), inline: 1})
            });
            if (b(d, "paste_text_use_dialog")) {
                d.addCommand("mcePasteText", function() {
                    d.windowManager.open({file: e.url + "/pastetext.htm", width: parseInt(b(d, "paste_dialog_width")), height: parseInt(b(d, "paste_dialog_height")), inline: 1})
                })
            }
            d.addButton("pasteword", {title: "paste.paste_word_desc", cmd: "mcePasteWord"})
        }});
    tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin)
})();